﻿名称：		CaramelBox
描述：		
封包：		.bin .dat .ar3
作者：		痴漢公賊  (glanser@163.com)
版本：		0.8.1
成熟度：	开发版

【TODO】
·类型1和3的资源解析。

【lz资源文件格式说明】
    类型是无目录的资源文件。
    元数据是$$$、scb（二进制脚本）、anb等。
	
	概述：lz文件分2部分－首部和1个或多个压缩数据块。首部记录了解压后的总长度；每个压缩块最前面放有一个压缩块头，记录了该块解压后的长度。所有数据块解压后的长度和应该等于首部中记录的解压后的总长度。

    	首部：
		s8 magic[2];		// "lz"标识，表示文件起始
		u32 total_uncomprlen;	// 总解压后的长度（be32）
 	压缩块头：紧接在文件头后面
		s8 sync[2];		// "ze"标识，表示压缩块起始
		u16 uncomprlen;		// 当前块解压后的长度（be16）
	压缩数据：紧接在文件头后面，采用位变长编码：用N个值为0的位表示值L的位数，接下来的N+1位是值L的实际值:

		00000000............0000000XXX..................XXX
		|-- N位0，表示值L的位数 --||-- L的值，占用N+1位 --|

	·值L的实际意义根据需要分为3种：
	直接输出的字节数B（需要减1）、待输出的数据在过去输出缓冲区中的位置O以及从这个位置开始输出的字节数C。
	·解压缩时按下面4个步骤进行：
	1. 获得直接输出的字节数B，然后按照该字节数B对应的位数（乘8）从压缩流中读取并直接输出。
	2. 获得待输出的数据在过去输出缓冲区中的位置O。
	3. 获得待输出的数据的字节数C。
	4. 从输出缓冲区的位置O处输出C字节。
	当输出的总字节数小于当前块的解压长度时，重复上面4个步骤；
	当输出的总字节数等于当前块的解压长度时，表示当前块解压缩完毕。然后重新读取压缩块头，如果压缩流没有结束的话，就重新初始化解压器，再重复上面4个步骤。

	解压器需要维护待使用的最多16位压缩数据。每当解压器维护的数据位数不足时，就读取2字节压缩数据，转换为little endian格式，并缓存起来。

【ChangeLog】
2009-06-18 19:14 ver 0.8.1 支持.ar3
2009-03-28 20:53 ver 0.8.0 支持ARC4类型的封包提取；支持.fcb和.map资源的提取
2008-03-01 17:01 ver 0.7.0 支持lz类型的资源提取
2008-02-15 18:20 ver 0.6.0 第一版发布
